package com.cictec.middleware.core.service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cictec.middleware.commons.cache.ecache.EHCacheUtils;
import com.cictec.middleware.commons.utils.DateUtils;
import com.cictec.middleware.commons.utils.PMSUtils;
import com.cictec.middleware.commons.utils.PropertiesUtils;
import com.cictec.middleware.core.entity.Bus;
import com.cictec.middleware.core.entity.BusDriver;
import com.cictec.middleware.core.entity.BusDriverSignIn;
import com.cictec.middleware.core.mapper.BusDriverMapper;
import com.cictec.middleware.core.mapper.BusDriverSignInMapper;

/**
 * 司机相关信息服务
 * @author ql
 *
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
@Service
public class BusDriverService {

	private static Logger logger = LoggerFactory.getLogger(BusDriverService.class);


	@Autowired
	private BusDriverMapper busDriverMapper;
	@Autowired
	private BusDriverSignInMapper busDriverSignInMapper;
	@Autowired
	private BusService busService;
	
	/**  司机签到信息缓存 */
	private static String DRIVER_SIGN = "bus-driver-sign";

	/**
	 * 【数据库】根据ic卡号查询司机
	 * 
	 * @param drvIcCard 卡号
	 * @return
	 */
	public BusDriver selectDriverByIC(String drvIcCard) {
		BusDriver driver = new BusDriver();
		driver.setDrvIcCard(drvIcCard);
		driver.setDrvDropFlag("0");
		return busDriverMapper.selectOne(driver);
	}
	
	/**
	 * 【数据库】查询司机
	 * @param drvUuid
	 * @return
	 */
	public BusDriver selectDriverByDrvUuid(String drvUuid) {
		BusDriver driver = new BusDriver();
		driver.setDrvUuid(drvUuid);
		driver.setDrvDropFlag("0");
		return busDriverMapper.selectOne(driver);
	}
	
	/**
	 * 【数据库】 查询所有司机
	 * @return
	 */
	public List<BusDriver> selectListDriver(){
		BusDriver driver = new BusDriver();
		driver.setDrvDropFlag("0");
		return busDriverMapper.select(driver);
		
	}
	

	
	/**
	 * 【数据库】司机签到
	 * @param driver
	 * @param bus
	 * @param lineUuid
	 * @param signTime	签到时间
	 */
	public void insertBusDirverSignIn(BusDriver driver, Bus bus, String lineUuid, Date signTime) {
		if (driver == null) {
			return;
		}
		
		logger.info("【司机签到】车辆 {} 司机 {}  ", bus.getBusPlateNumber(), driver.getDrvUuid());
		
		bus.setBusLoginDriverUuid(driver.getDrvUuid());
		bus.setBusLoginTime(signTime);
		busService.updateBusLoginDriver(bus.getBusUuid(), driver.getDrvUuid(), signTime);
		
		BusDriverSignIn signIn = new BusDriverSignIn();
		signIn.setSignUuid(PMSUtils.getUUID());
		signIn.setSignCardId(driver.getDrvIcCard());
		signIn.setSignDevUuid(bus.getBusDevUuid());
		signIn.setSignDrvUuid(driver.getDrvUuid());
		signIn.setSignLineUuid(lineUuid);
		signIn.setSignTime(DateUtils.formatDateTimes(signTime));
		signIn.setBusUuid(bus.getBusUuid());
		
		busDriverSignInMapper.insertSelective(signIn);
	}
	


	/**
	 * 【数据库】根据车辆查询司机签到信息,按照时间【正序】
	 * @param busUuid
	 * @param date
	 * @return
	 */
	public List<BusDriverSignIn> selectSignByBusUuid(String busUuid, String date){
		Map params = new HashMap();
		params.put("bus_uuid", busUuid);
		
		// 获取司机刷卡信息参数 默认0【0：取当天之前最后一条到当天的刷卡信息】【1:只取当天的刷卡信息】
		int getDriverSign = PropertiesUtils.getIntValue("system.parameter.driver.getDriverSign", 0);// 是否只取当天的司机刷卡信息
		if(getDriverSign == 1){
			List signDateList = new ArrayList();
			signDateList.add(date);
//			signDateList.add(DateUtils.getDateFormatFromDate(DateUtils.parseDate(date), -1));	// 前一天的签到信息
			params.put("signDateList", signDateList);
		}
		
		List<BusDriverSignIn> list = busDriverSignInMapper.selectDriverSignByParams(params);
		
		// 下面的操作 只是为了取最近刷卡2天的记录
		// 按照时间排序倒序
		list.sort(new Comparator<BusDriverSignIn>() {
			@Override
			public int compare(BusDriverSignIn o1, BusDriverSignIn o2) {
				
//				long c = o1.getDrvSignTime().getTime() - o2.getDrvSignTime().getTime(); // 升序
				long c = o2.getDrvSignTime().getTime() - o1.getDrvSignTime().getTime(); // 降序
				if(c < 0){
					return -1;
				}else if(c == 0){
					return 0;
				}else{
					return 1;
				}
//				return (int)c;
				
			}
		});
		List<BusDriverSignIn> rtList = new ArrayList<BusDriverSignIn>();
		
		Map map = new HashMap();
		int count = 0;
		Date cdate = DateUtils.getEndDateTime(date);
		for (BusDriverSignIn driverSignIn : list) {
			String sdate = DateUtils.formatDate(driverSignIn.getDrvSignTime());
			
			if(driverSignIn.getDrvSignTime().getTime() > cdate.getTime()){
				// 指定日期之前的(到最新想一条刷卡信息)
				rtList.add(driverSignIn);
			}else{
				
				// 指定日期之后的
				if(count < 2){
					if(!map.containsKey(sdate)){
						map.put(sdate, sdate);
						count ++;
					}
				}
				if(sdate.equals(PMSUtils.isNull(map.get(sdate)))){
					rtList.add(driverSignIn);
				}
			}
		}
		
		
//		for (DriverSignIn driverSignIn : list) {
//			String sdate = DateUtils.formatDate(driverSignIn.getDrvSignTime());
//			
//			if(driverSignIn.getDrvSignTime().getTime() > cdate.getTime()){
//				// 指定日期之前的
//				rtList.add(driverSignIn);
//				
//			}else{
//				
//				// 指定日期之后的
//				if(count < 2){
//					if(!map.containsKey(sdate)){
//						map.put(sdate, sdate);
//						count ++;
//					}
//				}
//				if(sdate.equals(PMSUtils.isNull(map.get(sdate)))){
//					rtList.add(driverSignIn);
//				}
//			}
//		}
		
		// 按照时间排序正序
		rtList.sort(new Comparator<BusDriverSignIn>() {
			@Override
			public int compare(BusDriverSignIn o1, BusDriverSignIn o2) {
				
				long c = o1.getDrvSignTime().getTime() - o2.getDrvSignTime().getTime(); // 升序
				return (int)c;
				
			}
		});
		
		// 过滤时间轴 重复的司机（取同时段内一个司机多次刷卡的第一个刷卡信息）
		List<BusDriverSignIn> rrtList = new ArrayList<BusDriverSignIn>();
		BusDriverSignIn rsign = null;
		for (BusDriverSignIn driverSignIn : rtList) {
			// 这样写防止时间轴上出现连续相同的司机 start
			if(rrtList.size() ==0){
				rrtList.add(driverSignIn);
				rsign = driverSignIn;
			}else{
				if(!rsign.getSignDrvUuid().equals(driverSignIn.getSignDrvUuid())){
					rrtList.add(driverSignIn);
					rsign = driverSignIn;
				}
			}
			// 这样写防止时间轴上出现连续相同的司机 end
		}
		rtList = rrtList;
		
//		System.out.println(rtList.size());
//		for (DriverSignIn driverSignIn : rtList) {
//			System.out.println(DateUtils.formatDateTime(driverSignIn.getDrvSignTime()) + "\t  " + driverSignIn.getDrvName());
//		}
		return rtList;
//		return driverSignInDao.selectList("com.cictec.middleware.core.mapper.DriverSignInMapper.selectDriverSignByParams", params);
		
	}
	
	
	/**
	 * 【缓存】根据车辆日期，获取司机签到信息
	 * @param busUuid
	 * @param date
	 * @return
	 */
	public List<BusDriverSignIn> getSignByBusUuid(String busUuid, String date){
		
		logger.debug("加载司机签到缓存 {}  busUuid:{}", date, busUuid);
		
		List<BusDriverSignIn> list = EHCacheUtils.getValue(DRIVER_SIGN, busUuid);
		
		if(list != null){
			return list;
		}
		list = selectSignByBusUuid(busUuid, date);
		
		EHCacheUtils.setValue(DRIVER_SIGN, busUuid, list);
		
		return list;
	}
	
	/**
	 * 【缓存】【司机签到】根据车辆、时间，获取最近一次司机签到信息
	 * @param busUuid
	 * @param currentTime	当前时间
	 * @return
	 */
	public BusDriverSignIn getSignDriver(String busUuid, Date currentTime) {
		
		List<BusDriverSignIn> list = getSignByBusUuid(busUuid, DateUtils.formatDate(currentTime));
		
		BusDriverSignIn driverSignin = null;
		if(list != null && list.size() > 0){
			
//			DriverSignIn driverSignin = null;
			for (BusDriverSignIn signIn : list) {
				if(!PMSUtils.isEmpty(signIn.getDrvSignTime()) && signIn.getDrvSignTime().getTime() < currentTime.getTime()){
					driverSignin = signIn;
				}
			}
			
//			if(driverSignin != null){
//				driver = new Driver();
//				driver.setDrvUuid(driverSignin.getSignDrvUuid());
//				driver.setDrvName(driverSignin.getDrvName());
//				driver.setDrvIcCard(driverSignin.getSignCardId());
//			}
		}
		
		return driverSignin;
	}
	
	/**
	 * 【缓存】刷新司机签到信息,加载指定日期及前一天的刷卡信息
	 * @param busUuid
	 * @param date yyyy-mm-dd
	 */
	public void refreshDriverSignIn(String busUuid, String date){
		
		List<BusDriverSignIn> list = EHCacheUtils.getValue(DRIVER_SIGN, busUuid);
		if(list != null){
			try {
				EHCacheUtils.removeElment(DRIVER_SIGN, busUuid);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		getSignByBusUuid(busUuid, date);

	}
	
	/**
	 * 【缓存】清空司机签到缓存
	 * @param busUuid
	 */
	public void clearDriverSignCache(String busUuid){
		
		// 这里直接删除缓存，等待调用时候重新加载
		try {
			EHCacheUtils.removeElment(DRIVER_SIGN, busUuid);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		logger.debug("清除所有司机签到缓存");
	}
	/**
	 * 【缓存】清空司机签到缓存
	 */
	public void clearDriverSignCache(){
		
		// 这里直接删除缓存，等待调用时候重新加载
		try {
			EHCacheUtils.removeEhcache(DRIVER_SIGN);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		logger.debug("清除所有司机签到缓存");
	}
	
	
}
